{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "33c91cae-2ff8-45a6-b8cb-671619e9c933",
    "_uuid": "0a395fd25f20834b070ef55cb8987c8c1f9b55f9"
   },
   "source": [
    "# 1. 数据导入"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "_cell_guid": "de05512e-6991-44df-9599-da92a7e459ac",
    "_uuid": "d8bdd5f0320e244e4702ed8ec1c2482b022c51cd"
   },
   "outputs": [],
   "source": [
    "import numpy as np \n",
    "import pandas as pd \n",
    "\n",
    "from sklearn import preprocessing\n",
    "import matplotlib.pyplot as plt \n",
    "plt.rc(\"font\", size=14) # 14号大小\n",
    "import seaborn as sns\n",
    "sns.set(style=\"white\") # 白色背景 for seaborn plots\n",
    "sns.set(style=\"whitegrid\", color_codes=True)\n",
    "\n",
    "import warnings\n",
    "warnings.simplefilter(action='ignore')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "_cell_guid": "e0a17223-f682-45fc-89a5-667af9782bbe",
    "_uuid": "7964157913fbcff581fc1929eed487708e81ac9c"
   },
   "outputs": [
    {
     "data": {
      "text/plain": "   PassengerId  Survived  Pclass  \\\n0            1         0       3   \n1            2         1       1   \n2            3         1       3   \n3            4         1       1   \n4            5         0       3   \n\n                                                Name     Sex   Age  SibSp  \\\n0                            Braund, Mr. Owen Harris    male  22.0      1   \n1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n2                             Heikkinen, Miss. Laina  female  26.0      0   \n3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n4                           Allen, Mr. William Henry    male  35.0      0   \n\n   Parch            Ticket     Fare Cabin Embarked  \n0      0         A/5 21171   7.2500   NaN        S  \n1      0          PC 17599  71.2833   C85        C  \n2      0  STON/O2. 3101282   7.9250   NaN        S  \n3      0            113803  53.1000  C123        S  \n4      0            373450   8.0500   NaN        S  ",
      "text/html": "<div>\n<style scoped>\n    .dataframe tbody tr th:only-of-type {\n        vertical-align: middle;\n    }\n\n    .dataframe tbody tr th {\n        vertical-align: top;\n    }\n\n    .dataframe thead th {\n        text-align: right;\n    }\n</style>\n<table border=\"1\" class=\"dataframe\">\n  <thead>\n    <tr style=\"text-align: right;\">\n      <th></th>\n      <th>PassengerId</th>\n      <th>Survived</th>\n      <th>Pclass</th>\n      <th>Name</th>\n      <th>Sex</th>\n      <th>Age</th>\n      <th>SibSp</th>\n      <th>Parch</th>\n      <th>Ticket</th>\n      <th>Fare</th>\n      <th>Cabin</th>\n      <th>Embarked</th>\n    </tr>\n  </thead>\n  <tbody>\n    <tr>\n      <th>0</th>\n      <td>1</td>\n      <td>0</td>\n      <td>3</td>\n      <td>Braund, Mr. Owen Harris</td>\n      <td>male</td>\n      <td>22.0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>A/5 21171</td>\n      <td>7.2500</td>\n      <td>NaN</td>\n      <td>S</td>\n    </tr>\n    <tr>\n      <th>1</th>\n      <td>2</td>\n      <td>1</td>\n      <td>1</td>\n      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n      <td>female</td>\n      <td>38.0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>PC 17599</td>\n      <td>71.2833</td>\n      <td>C85</td>\n      <td>C</td>\n    </tr>\n    <tr>\n      <th>2</th>\n      <td>3</td>\n      <td>1</td>\n      <td>3</td>\n      <td>Heikkinen, Miss. Laina</td>\n      <td>female</td>\n      <td>26.0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>STON/O2. 3101282</td>\n      <td>7.9250</td>\n      <td>NaN</td>\n      <td>S</td>\n    </tr>\n    <tr>\n      <th>3</th>\n      <td>4</td>\n      <td>1</td>\n      <td>1</td>\n      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n      <td>female</td>\n      <td>35.0</td>\n      <td>1</td>\n      <td>0</td>\n      <td>113803</td>\n      <td>53.1000</td>\n      <td>C123</td>\n      <td>S</td>\n    </tr>\n    <tr>\n      <th>4</th>\n      <td>5</td>\n      <td>0</td>\n      <td>3</td>\n      <td>Allen, Mr. William Henry</td>\n      <td>male</td>\n      <td>35.0</td>\n      <td>0</td>\n      <td>0</td>\n      <td>373450</td>\n      <td>8.0500</td>\n      <td>NaN</td>\n      <td>S</td>\n    </tr>\n  </tbody>\n</table>\n</div>"
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 导入训练数据集\n",
    "train_df = pd.read_csv(\"./input/train.csv\")\n",
    "\n",
    "# 导入测试数据集\n",
    "test_df = pd.read_csv(\"./input/test.csv\")\n",
    "\n",
    "# 训练集预览\n",
    "train_df.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "![](./image/1.png)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "_cell_guid": "872d0de9-a873-4b60-b1ee-d557ee39d8a1",
    "_uuid": "d38222a64d4dfd1d1ee1a7ee1f58c4aa54560de3"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集数据量 891.\n",
      "测试集数据量 418.\n"
     ]
    }
   ],
   "source": [
    "print('训练集数据量 {}.'.format(train_df.shape[0]))\n",
    "print('测试集数据量 {}.'.format(test_df.shape[0])) # 测试数据中没有目标变量(即:“生存”栏缺失)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "6578c0da-7bcf-433d-9f28-a66d8dfa6fa3",
    "_uuid": "8660e63a62c2fcdb4f7633380166438caf5edae9"
   },
   "source": [
    "# 2. 数据预处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "_cell_guid": "29dddd33-d995-4b0f-92ea-a361b368cc42",
    "_uuid": "d4fe22ead7e187724ca6f3ba7ba0e6412ae0e874"
   },
   "outputs": [
    {
     "data": {
      "text/plain": "PassengerId      0\nSurvived         0\nPclass           0\nName             0\nSex              0\nAge            177\nSibSp            0\nParch            0\nTicket           0\nFare             0\nCabin          687\nEmbarked         2\ndtype: int64"
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 查看空值的数量\n",
    "train_df.isnull().sum()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "7776faeb-6a8f-4460-a367-4b087d2cc089",
    "_uuid": "696b428bd3ca49421f650665267ce7ca1b358814"
   },
   "source": [
    "## 2.1.    Age - 缺失数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "_cell_guid": "d4ee6559-6d0c-409d-9dca-1d105a4ccd8a",
    "_uuid": "129cf984d05d9ce97c54548145e65f9e4b9b0c37"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "缺失age 数据占比: 19.87%\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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\n"
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# percent of missing \"Age\" \n",
    "miss_age = train_df['Age'].isnull().sum() # age 缺失数据量\n",
    "train_count = train_df.shape[0] # 训练集数量\n",
    "print('缺失age 数据占比: %.2f%%' %((miss_age/train_count)*100))\n",
    "\n",
    "# hist 直方图将对数据集进行统计\n",
    "ax = train_df[\"Age\"].hist(bins=15, density=True, color='teal', alpha=0.8) \n",
    "\"\"\"\n",
    "bins: 统计的区间分布\n",
    "density: bool，默认为false，显示的是频数统计结果，为True则显示频率统计结果\n",
    "color: 颜色\n",
    "alpha设置透明度，0为完全透明\n",
    "\"\"\"\n",
    "train_df[\"Age\"].plot(kind='density', color='red') # 绘制曲线\n",
    "ax.set(xlabel='Age') # x label\n",
    "plt.xlim(-10,85) # x 轴范围\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "_cell_guid": "1d70c27b-1e4d-4d5e-8a39-c134389d436c",
    "_uuid": "4f13840d4f9bf1b4331523c99274aa0627485e6c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "平均值 \"Age\" is 29.70\n",
      "中位数 \"Age\" is 28.00\n"
     ]
    }
   ],
   "source": [
    "#  age 平均值\n",
    "print('平均值 \"Age\" is %.2f' %(train_df[\"Age\"].mean(skipna=True)))\n",
    "# age 中位数\n",
    "print('中位数 \"Age\" is %.2f' %(train_df[\"Age\"].median(skipna=True)))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**因为age 数据集中在20~40 比较集中，平均值稍高于中位数， 可以选择中位数作为填充值**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "dea7b01c-c8c1-401f-a336-36ee73de2222",
    "_uuid": "e1a08114e302ddc90266e5f065b3f0b5a200bc89"
   },
   "source": [
    "## 2.2. Cabin - 客舱号"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "_cell_guid": "1a1ad808-0a63-43ac-b757-71195880ed4f",
    "_uuid": "1acbce9c6bc5d586dda3e47b7506067a85524e66"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Cabin 缺失率 77.10%\n"
     ]
    }
   ],
   "source": [
    "# \"Cabin\" 缺失百分比\n",
    "print('Cabin 缺失率 %.2f%%' %((train_df['Cabin'].isnull().sum()/train_df.shape[0])*100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**缺失率较高，使用值进行填充，也会导致数据维度方差较低，数据区分不明显**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "0e696cff-ca80-4cb5-862c-ee80f4b1ab1f",
    "_uuid": "d575319b1f528c7a153d8ab680282048cb163b14"
   },
   "source": [
    "<a id=\"t2.3.\"></a>\n",
    "## 2.3. Embarked - Missing Values"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "_cell_guid": "f21c2b55-2126-439d-8b1d-e96dafc97d81",
    "_uuid": "92ab9e62fb62f2a0fb9972baf6ada444187540e6"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Embarked 缺失率 0.22%\n"
     ]
    }
   ],
   "source": [
    "# \"Embarked\" 缺失率\n",
    "print('Embarked 缺失率 %.2f%%' %((train_df['Embarked'].isnull().sum()/train_df.shape[0])*100))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "d03a4187-c527-4f71-8260-0495f4523e9e",
    "_uuid": "dc97b80524057522f024d0ae6f1abe77cb994903"
   },
   "source": [
    "**缺失率较低，可以使用多数登船口进行缺失值替换**"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "_cell_guid": "22924bc4-5dfa-4df7-b0d0-de3ede9c58b7",
    "_uuid": "f2a915f45264f8a580de6cc382d96b370eb75730"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "登船口 (C = Cherbourg, Q = Queenstown, S = Southampton):\n",
      "S    644\n",
      "C    168\n",
      "Q     77\n",
      "Name: Embarked, dtype: int64\n"
     ]
    },
    {
     "data": {
      "text/plain": "<Figure size 432x288 with 1 Axes>",
      "image/png": "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5ptv1q9+9St9/vnnKiws1BtvvKGnn35ae/bskd/v19GjR8Pb//L3AixatEiXXHKJsrOzJUl79uzR3r17w3so0vGTv+3atUsfffSRbrzxRl100UWSpJycHG3YsOEs/VaA44gDcApfPkWC03nq/1W+/J0NDodDTqdT9957r0KhkGbMmKHvf//72rdv30lnaR08ePBJ11uzZo1++9vf6tlnn9WPf/xjhUIhDRs2TC+++GJ4nZaWFg0dOlSPPPLISduKiYk57fsJfBXerQScgf/+97+qr6+XJP3tb39TcnKyBg0apG3btmnp0qXKysqSw+HQzp07w2doPZVJkyappKRETz31lHbv3q3LL79cLpcrHId9+/Zp1qxZ8nq9uv766+XxeHT48GF1dXWdFBDgbGHPAResH/3oR8Yz/3vvvVcDBw6MeBtjxozRE088oU8++UQjR45USUmJJKmgoEBLly7V1772NQ0aNEjf+c53tHfv3h63tWTJEhUWFur5559XeXm5HnroIf3hD39QZ2enfvaznyk5OVnS8Sjl5ORo2LBhGjdunA4cONDLew90j3MrAQAMHFYCABiIAwDAQBwAAAbiAAAwEAcAgIE4AAAMxAEAYCAOAADD/wMKKbtZdekfTwAAAABJRU5ErkJggg==\n"
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "最多登船口 S.\n"
     ]
    }
   ],
   "source": [
    "print('登船口 (C = Cherbourg, Q = Queenstown, S = Southampton):')\n",
    "print(train_df['Embarked'].value_counts())\n",
    "sns.countplot(x='Embarked', data=train_df, palette='Set2') # 使用条形显示每个分箱器中的观察计数\n",
    "plt.show()\n",
    "\n",
    "print('最多登船口 %s.' %train_df['Embarked'].value_counts().idxmax())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "def67427-3257-4dce-872e-7f5b4202d18a",
    "_uuid": "c57a9f8a54efa382bc94b695c9664330d01709ea"
   },
   "source": [
    "**可以使用S, 替换缺失登船口的用户**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "684c308f-25ae-4039-9332-ddb58953a054",
    "_uuid": "3609e785d210d5a8110f7ce550e61007d066449b"
   },
   "source": [
    "## 2.4. 缺失值替换"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "_cell_guid": "bc0d7121-1008-4890-9043-07eba1524e15",
    "_uuid": "feeed4b6775f88edf5de12b0ee6ee73c16eba61d"
   },
   "outputs": [],
   "source": [
    "train_data = train_df.copy()\n",
    "# 中位数替换age 缺失值\n",
    "train_data[\"Age\"].fillna(train_df[\"Age\"].median(skipna=True), inplace=True)\n",
    "# 用S 替换没有登船口缺失值\n",
    "train_data[\"Embarked\"].fillna(train_df['Embarked'].value_counts().idxmax(), inplace=True)\n",
    "train_data.drop('Cabin', axis=1, inplace=True) # 删除Cabin 列"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "_cell_guid": "0cfe1c08-71a6-493e-803d-db255af01697",
    "_uuid": "d6be29651bb903964e02d3a7bcc7033513eb76c9"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PassengerId    0\n",
       "Survived       0\n",
       "Pclass         0\n",
       "Name           0\n",
       "Sex            0\n",
       "Age            0\n",
       "SibSp          0\n",
       "Parch          0\n",
       "Ticket         0\n",
       "Fare           0\n",
       "Embarked       0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# check missing values in adjusted train data\n",
    "train_data.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "_cell_guid": "10dcfe1b-34f1-4bd8-b937-5ae8daf4a378",
    "_uuid": "3ee37b1151416aeeec8ebd7b94bb0184aabc57cd"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>PassengerId</th>\n",
       "      <th>Survived</th>\n",
       "      <th>Pclass</th>\n",
       "      <th>Name</th>\n",
       "      <th>Sex</th>\n",
       "      <th>Age</th>\n",
       "      <th>SibSp</th>\n",
       "      <th>Parch</th>\n",
       "      <th>Ticket</th>\n",
       "      <th>Fare</th>\n",
       "      <th>Embarked</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Braund, Mr. Owen Harris</td>\n",
       "      <td>male</td>\n",
       "      <td>22.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>A/5 21171</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>2</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Cumings, Mrs. John Bradley (Florence Briggs Th...</td>\n",
       "      <td>female</td>\n",
       "      <td>38.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>PC 17599</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>C</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>3</td>\n",
       "      <td>1</td>\n",
       "      <td>3</td>\n",
       "      <td>Heikkinen, Miss. Laina</td>\n",
       "      <td>female</td>\n",
       "      <td>26.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>STON/O2. 3101282</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>4</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>Futrelle, Mrs. Jacques Heath (Lily May Peel)</td>\n",
       "      <td>female</td>\n",
       "      <td>35.0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>113803</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>5</td>\n",
       "      <td>0</td>\n",
       "      <td>3</td>\n",
       "      <td>Allen, Mr. William Henry</td>\n",
       "      <td>male</td>\n",
       "      <td>35.0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>373450</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>S</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   PassengerId  Survived  Pclass  \\\n",
       "0            1         0       3   \n",
       "1            2         1       1   \n",
       "2            3         1       3   \n",
       "3            4         1       1   \n",
       "4            5         0       3   \n",
       "\n",
       "                                                Name     Sex   Age  SibSp  \\\n",
       "0                            Braund, Mr. Owen Harris    male  22.0      1   \n",
       "1  Cumings, Mrs. John Bradley (Florence Briggs Th...  female  38.0      1   \n",
       "2                             Heikkinen, Miss. Laina  female  26.0      0   \n",
       "3       Futrelle, Mrs. Jacques Heath (Lily May Peel)  female  35.0      1   \n",
       "4                           Allen, Mr. William Henry    male  35.0      0   \n",
       "\n",
       "   Parch            Ticket     Fare Embarked  \n",
       "0      0         A/5 21171   7.2500        S  \n",
       "1      0          PC 17599  71.2833        C  \n",
       "2      0  STON/O2. 3101282   7.9250        S  \n",
       "3      0            113803  53.1000        S  \n",
       "4      0            373450   8.0500        S  "
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 预览调整数据\n",
    "train_data.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Survived</th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>TravelAlone</th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>Sex_male</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>22.0</td>\n",
       "      <td>7.2500</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>1</td>\n",
       "      <td>38.0</td>\n",
       "      <td>71.2833</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>1</td>\n",
       "      <td>26.0</td>\n",
       "      <td>7.9250</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>35.0</td>\n",
       "      <td>53.1000</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>0</td>\n",
       "      <td>35.0</td>\n",
       "      <td>8.0500</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   Survived   Age     Fare  TravelAlone  Pclass_1  Pclass_2  Pclass_3  \\\n",
       "0         0  22.0   7.2500            0         0         0         1   \n",
       "1         1  38.0  71.2833            0         1         0         0   \n",
       "2         1  26.0   7.9250            1         0         0         1   \n",
       "3         1  35.0  53.1000            0         1         0         0   \n",
       "4         0  35.0   8.0500            1         0         0         1   \n",
       "\n",
       "   Embarked_C  Embarked_Q  Embarked_S  Sex_male  \n",
       "0           0           0           1         1  \n",
       "1           1           0           0         0  \n",
       "2           0           0           1         0  \n",
       "3           0           0           1         0  \n",
       "4           0           0           1         1  "
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 使用是否独自旅行，替代是否有兄弟姐妹，配偶和子女父母，减少复杂度\n",
    "train_data['TravelAlone']=np.where((train_data[\"SibSp\"]+train_data[\"Parch\"])>0, 0, 1)\n",
    "train_data.drop('SibSp', axis=1, inplace=True)\n",
    "train_data.drop('Parch', axis=1, inplace=True)\n",
    "\n",
    "# 使用one-hot 编码，进行离散值数据维度拆分\n",
    "training=pd.get_dummies(train_data, columns=[\"Pclass\",\"Embarked\",\"Sex\"])\n",
    "training.drop('Sex_female', axis=1, inplace=True)\n",
    "\n",
    "# 去掉无关维度\n",
    "training.drop('PassengerId', axis=1, inplace=True) # 乘客ID\n",
    "training.drop('Name', axis=1, inplace=True) # 姓名对结果无影响\n",
    "training.drop('Ticket', axis=1, inplace=True) # 票号\n",
    "\n",
    "final_train = training\n",
    "final_train.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "768cf074-6ecb-47eb-9b42-8b9079ffb811",
    "_uuid": "6a8e533e77c7f1f1a68d136119f93972447a31cf"
   },
   "source": [
    "### 测试集与train 对齐"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "_cell_guid": "501f9a53-881d-4440-9366-7aae67eb358b",
    "_uuid": "d80416a026d17ccac3bf793408dd5f4f1e17bf63"
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PassengerId      0\n",
       "Pclass           0\n",
       "Name             0\n",
       "Sex              0\n",
       "Age             86\n",
       "SibSp            0\n",
       "Parch            0\n",
       "Ticket           0\n",
       "Fare             1\n",
       "Cabin          327\n",
       "Embarked         0\n",
       "dtype: int64"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_df.isnull().sum()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "_cell_guid": "8b9ef076-3669-4339-8d10-0d8783a92e07",
    "_uuid": "145675b90aa2befa533c640aaedd4bf8069b12d4"
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>TravelAlone</th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>Sex_male</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.5</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>47.0</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>62.0</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>27.0</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.0</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Age     Fare  TravelAlone  Pclass_1  Pclass_2  Pclass_3  Embarked_C  \\\n",
       "0  34.5   7.8292            1         0         0         1           0   \n",
       "1  47.0   7.0000            0         0         0         1           0   \n",
       "2  62.0   9.6875            1         0         1         0           0   \n",
       "3  27.0   8.6625            1         0         0         1           0   \n",
       "4  22.0  12.2875            0         0         0         1           0   \n",
       "\n",
       "   Embarked_Q  Embarked_S  Sex_male  \n",
       "0           1           0         1  \n",
       "1           0           1         0  \n",
       "2           1           0         1  \n",
       "3           0           1         1  \n",
       "4           0           1         0  "
      ]
     },
     "execution_count": 15,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "test_data = test_df.copy()\n",
    "test_data[\"Age\"].fillna(train_df[\"Age\"].median(skipna=True), inplace=True)\n",
    "test_data[\"Fare\"].fillna(train_df[\"Fare\"].median(skipna=True), inplace=True)\n",
    "test_data.drop('Cabin', axis=1, inplace=True)\n",
    "\n",
    "# 标记是否独自旅行\n",
    "test_data['TravelAlone']=np.where((test_data[\"SibSp\"]+test_data[\"Parch\"])>0, 0, 1)\n",
    "test_data.drop('SibSp', axis=1, inplace=True)\n",
    "test_data.drop('Parch', axis=1, inplace=True)\n",
    "\n",
    "testing = pd.get_dummies(test_data, columns=[\"Pclass\",\"Embarked\",\"Sex\"])\n",
    "testing.drop('Sex_female', axis=1, inplace=True)\n",
    "testing.drop('PassengerId', axis=1, inplace=True)\n",
    "testing.drop('Name', axis=1, inplace=True)\n",
    "testing.drop('Ticket', axis=1, inplace=True)\n",
    "\n",
    "final_test = testing\n",
    "final_test.head()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>Age</th>\n",
       "      <th>Fare</th>\n",
       "      <th>TravelAlone</th>\n",
       "      <th>Pclass_1</th>\n",
       "      <th>Pclass_2</th>\n",
       "      <th>Pclass_3</th>\n",
       "      <th>Embarked_C</th>\n",
       "      <th>Embarked_Q</th>\n",
       "      <th>Embarked_S</th>\n",
       "      <th>Sex_male</th>\n",
       "      <th>IsMinor</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>34.5</td>\n",
       "      <td>7.8292</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>47.0</td>\n",
       "      <td>7.0000</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>62.0</td>\n",
       "      <td>9.6875</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>27.0</td>\n",
       "      <td>8.6625</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>22.0</td>\n",
       "      <td>12.2875</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "    Age     Fare  TravelAlone  Pclass_1  Pclass_2  Pclass_3  Embarked_C  \\\n",
       "0  34.5   7.8292            1         0         0         1           0   \n",
       "1  47.0   7.0000            0         0         0         1           0   \n",
       "2  62.0   9.6875            1         0         1         0           0   \n",
       "3  27.0   8.6625            1         0         0         1           0   \n",
       "4  22.0  12.2875            0         0         0         1           0   \n",
       "\n",
       "   Embarked_Q  Embarked_S  Sex_male  IsMinor  \n",
       "0           1           0         1        0  \n",
       "1           0           1         0        0  \n",
       "2           1           0         1        0  \n",
       "3           0           1         1        0  \n",
       "4           0           1         0        0  "
      ]
     },
     "execution_count": 16,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# 添加是不是未成年\n",
    "final_train['IsMinor']=np.where(final_train['Age']<=16, 1, 0)\n",
    "final_test['IsMinor']=np.where(final_test['Age']<=16, 1, 0)\n",
    "\n",
    "final_test.head()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "c833cbf5-74db-44ff-90fa-b600ff0a09d7",
    "_uuid": "39dbc095f99dcec6d25a7a4561e81bb641078622"
   },
   "source": [
    "# 3. Logistic Regression"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "b70cda8a-e8d9-44a6-b9f0-2b365fdf3428",
    "_uuid": "136cf9e02ea1ab48a397f534b491fb2d9dbb5684"
   },
   "source": [
    "## 3.1. 特征选择"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "_cell_guid": "11a2a468-20df-40cd-a4ba-4ae7bd2fc403",
    "_uuid": "64befdf1182c2b4e845f488f5bfd0e19ce3dc17a"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "选择的特征: ['Age', 'TravelAlone', 'Pclass_1', 'Pclass_2', 'Embarked_C', 'Embarked_S', 'Sex_male', 'IsMinor']\n"
     ]
    }
   ],
   "source": [
    "from sklearn.linear_model import LogisticRegression\n",
    "from sklearn.feature_selection import RFE\n",
    "\n",
    "\"\"\"\n",
    "使用RFE进行特征选择：RFE是常见的特征选择方法，也叫递归特征消除。它的工作原理是递归删除特征，\n",
    "并在剩余的特征上构建模型。它使用模型准确率来判断哪些特征（或特征组合）对预测结果贡献较大。\n",
    "\"\"\"\n",
    "\n",
    "cols = [\"Age\",\"Fare\",\"TravelAlone\",\"Pclass_1\",\"Pclass_2\",\"Embarked_C\",\"Embarked_S\",\"Sex_male\",\"IsMinor\"] \n",
    "X = final_train[cols] # x 数据集\n",
    "y = final_train['Survived'] # label \n",
    "\n",
    "# 构建逻辑回归(在线性回归基础上(现实问题难以直接用线性函数直接匹配), 套用sigmod函数(值域为0-1,以概率方式来处理问题))\n",
    "\"\"\"\n",
    "参数\n",
    "# penalty 正则化'l1', 'l2' default ='l2'\n",
    "# C=1e5 正则化系数λ的倒数，正则化参数, 越小惩罚力度越大\n",
    "solver：优化算法选择参数，只有五个可选参数，即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法，有四种算法可以选择，分别是：\n",
    "liblinear：使用了开源的liblinear库实现，内部使用了坐标轴下降法来迭代优化损失函数。\n",
    "lbfgs：拟牛顿法的一种，利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。\n",
    "newton-cg：也是牛顿法家族的一种，利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。\n",
    "sag：即随机平均梯度下降，是梯度下降法的变种，和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度，适合于样本数据多的时候。\n",
    "saga：线性收敛的随机优化算法的的变重。\n",
    "\n",
    "max_iter：算法收敛最大迭代次数，int类型，默认为10。 - 学习率通过max_inter 控制\n",
    "仅在正则化优化算法为newton-cg, sag和lbfgs才有用，算法收敛的最大迭代次数。\n",
    "\"\"\"\n",
    "\n",
    "lr_model = LogisticRegression(penalty='l2')\n",
    "\n",
    "#  8 属性进行递归特征消除\n",
    "rfe = RFE(lr_model, n_features_to_select= 8, step = 1)\n",
    "rfe = rfe.fit(X, y)\n",
    "# 汇总选择属性\n",
    "print('选择的特征: %s' % list(X.columns[rfe.support_]))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 55,
   "metadata": {
    "_cell_guid": "08986ec4-79ff-466b-b763-61bf84a0879b",
    "_uuid": "3f6950a7c24c629b72e17e54c556f3c183b3f779"
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 576x360 with 2 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "Selected_features = ['Age', 'TravelAlone', 'Pclass_1', 'Pclass_2', 'Embarked_C', \n",
    "                     'Embarked_S', 'Sex_male', 'IsMinor']\n",
    "X = final_train[Selected_features] # 训练集\n",
    "\n",
    "# 计算皮尔森系数 corr\n",
    "plt.subplots(figsize=(8, 5))\n",
    "sns.heatmap(X.corr(), annot=True, cmap=\"RdYlGn\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "b894002e-07cf-4d02-b708-a2ac387eed54",
    "_uuid": "e35125f8aa230d4875541aa4f6b5964d2f14a6a3"
   },
   "source": [
    "### 模型训练"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "_cell_guid": "84233f59-f3c7-4ea0-884d-96f8ad4d5b10",
    "_uuid": "46336228eeb864bc82e6739768122579d1c9634c"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "accuracy is 0.947\n",
      "recall is 0.928\n",
      "auc is 0.989\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn.model_selection import train_test_split, cross_val_score\n",
    "from sklearn.metrics import accuracy_score, classification_report, precision_score, recall_score \n",
    "from sklearn.metrics import confusion_matrix, precision_recall_curve, roc_curve, auc, log_loss\n",
    "\n",
    "Selected_features = ['Age', 'TravelAlone', 'Pclass_1', 'Pclass_2', 'Embarked_C', \n",
    "                     'Embarked_S', 'Sex_male', 'IsMinor']\n",
    "\n",
    "X = final_train[Selected_features] # 训练集\n",
    "y = final_train['Survived'] # label \n",
    "\n",
    "# 测试集\n",
    "X_test = final_test[Selected_features] # 测试集\n",
    "y_test_df = pd.read_csv(\"./input/gender_submission.csv\")\n",
    "y_test = y_test_df['Survived'] # test label \n",
    "\n",
    "# 模型训练\n",
    "logreg = LogisticRegression()\n",
    "logreg.fit(X, y)\n",
    "\n",
    "y_pred = logreg.predict(X_test) # 预测-测试集\n",
    "y_pred_proba = logreg.predict_proba(X_test)[:, 1] \n",
    "[fpr, tpr, thr] = roc_curve(y_test, y_pred_proba) # fpr = 假正率 / tpr= 真正率\n",
    "\n",
    "# 准确率、recall、auc\n",
    "print(\"accuracy is %2.3f\" % accuracy_score(y_test, y_pred)) \n",
    "print(\"recall is %2.3f\" % recall_score(y_test, y_pred))\n",
    "# auc is 0.989, 过拟合\n",
    "print(\"auc is %2.3f\" % auc(fpr, tpr))\n",
    "\n",
    "idx = np.min(np.where(tpr > 0.95)) # 敏感性 > 0.95\n",
    "\n",
    "plt.figure()\n",
    "# 绘制 ROC 曲线\n",
    "plt.plot(fpr, tpr, color='coral', label='ROC curve (area = %0.3f)' % auc(fpr, tpr))\n",
    "plt.plot([0, 1], [0, 1], 'k--')\n",
    "plt.plot([0,fpr[idx]], [tpr[idx],tpr[idx]], 'k--', color='blue')\n",
    "plt.plot([fpr[idx],fpr[idx]], [0,tpr[idx]], 'k--', color='blue')\n",
    "\n",
    "plt.xlim([0.0, 1.0]) # x 轴范围\n",
    "plt.ylim([0.0, 1.05]) # y 轴范围\n",
    "plt.xlabel('fpr', fontsize=14)\n",
    "plt.ylabel('tpr(recall)', fontsize=14)\n",
    "plt.title('ROC curve')\n",
    "plt.legend(loc=\"lower right\")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "_cell_guid": "bf358561-2762-4b24-b33b-bfda3c5d725f",
    "_uuid": "9debd9d4281cf7893159aa2cb1f7993652d60228"
   },
   "source": [
    "### 交叉验证"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "_cell_guid": "9ea95aac-00b2-413e-ab86-c6b8782c40ef",
    "_uuid": "90840c89d42e9284c9480a256dc259778c3a5b1b"
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K-fold cross-validation results:\n",
      "average accuracy: 0.795 (+/-0.025)\n",
      "average log_loss: 0.454 (+/-0.037)\n",
      "average auc: 0.850 (+/-0.028)\n"
     ]
    }
   ],
   "source": [
    "from sklearn.model_selection import cross_validate\n",
    "\n",
    "scoring = {'accuracy': 'accuracy', 'log_loss': 'neg_log_loss', 'auc': 'roc_auc'}\n",
    "modelCV = LogisticRegression()\n",
    "results = cross_validate(modelCV, X, y, cv=10, scoring=list(scoring.values()), \n",
    "                         return_train_score=False)\n",
    "\n",
    "print('K-fold cross-validation results:')\n",
    "for sc in range(len(scoring)):\n",
    "    print(\"average %s: %.3f (+/-%.3f)\" % (list(scoring.keys())[sc], -results['test_%s' % list(scoring.values())[sc]].mean()\n",
    "                               if list(scoring.values())[sc]=='neg_log_loss' \n",
    "                               else results['test_%s' % list(scoring.values())[sc]].mean(), \n",
    "                               results['test_%s' % list(scoring.values())[sc]].std()))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}